package org.batatasframework.support.charts.db;

import java.util.Map;

import org.batatasframework.support.charts.ResultArrayReader;
import org.batatasframework.support.charts.ResultData;
import org.batatasframework.support.charts.ResultDataReader;

/**
 * 解析直接从数据库读取返回的结果集
 * @author jackson
 *
 */
public class DBChartData implements ResultData{
//	
//	/**
//	 * <pre>
//	 * 这是最普通的情况，返回的结果里，直接第一个字段为label，
//	 * 第二个字段为统计数据的值，并且已经是统计好的情况
//	 * 
//	 * 如：查询语句为 select x.name,sum(x.value) ... group by x.name 的查询语句
//	 * </pre>
//	 */
//	public final static DBChartData read(List<Object> items){
//		int len = items.size(), i = 0;
//		
//		String[] labels = new String[len];
//		Object[] data = new Object[len];
//		
//		for(Object it : items){
//			Object[] vs = (Object[])it;
//			labels[i] = vs[0].toString();
//			data[i++] = vs[1];
//		}
//		
//		return new DBChartData(labels, data);
//	}
//	
//	public final static DBChartData count(List<Object> items){
//		Map<String, Integer> maps = new LinkedHashMap<>();
//		for(Object it : items){
//			
//			String val;
//			if(it instanceof Object[]){
//				val = ((Object[])it)[0].toString();
//			}else{
//				val = it.toString();
//			}
//			
//			Integer count = maps.get(val);
//			if(null == count){
//				count = 1;
//			}else{
//				count += 1;
//			}
//			maps.put(val, count);
//		}
//		
//		return new DBChartData(
//			maps.keySet().toArray(new String[maps.size()]), 
//			maps.values().toArray()
//		);
//	}
	
//	private DBChartData(String[] labels, Object[] data) {
//		this.labels = labels;
//		this.data = data;
//	}

	public DBChartData(ResultArrayReader reader){
		this(reader, false);
	}

	public DBChartData(ResultArrayReader reader, boolean reverse){
		Map<String, Number[]> maps = reader.getMaps();
		if(reverse){
			labels = maps.keySet().toArray(new String[maps.size()]);
			data = new Object[labels.length];
			int i = 0;
			for(Number[] nus : maps.values()){
				Number val = 0L;
				for(Number nu : nus){
					if(nu instanceof Double){
						val = val.doubleValue() + nu.doubleValue();
					}else{
						val = val.longValue() + nu.longValue();
					}
				}
				data[i++] = val;
			}
		}else{
			labels = reader.getColumns();
			Number[] data = new Number[labels.length];
			for(int i = 0; i < labels.length; i++){
				data[i] = 0L;
			}
			for(Number[] nus : maps.values()){
				if(nus.length == 0) continue;
				
				if(nus[0] instanceof Double){
					for(int i = 0; i < nus.length; i++){
						data[i] = data[i].doubleValue() + nus[i].doubleValue();
					}
				}else{
					for(int i = 0; i < nus.length; i++){
						data[i] = data[i].longValue() + nus[i].longValue();
					}
				}
			}
		}
	}
	
	public DBChartData(ResultDataReader reader){
		this.labels = reader.getLables();
		this.data = reader.getData();
	}

	private String[] labels;
	private Object[] data;

	@Override
	public String[] getLabels() {
		return labels;
	}

	@Override
	public Object[] getData() {
		return data;
	}

}
